/*********************************************************************
* Author: CJH
A serial port library for ROS development that can directly communicate with Posestamped and twist.
*********************************************************************/
#ifndef __COMMON_USB_SERIAL_H_
#define __COMMON_USB_SERIAL_H_
#define Pi 3.1415926535f


#include "tf/tf.h"
#include <ros/ros.h>
#include <ros/time.h>
#include <serial/serial.h>
#include <geometry_msgs/Twist.h>
#include <geometry_msgs/Pose.h>


#include <iostream>


serial::Serial Ros_to_Stm32;//设置ros串口函数,无法在命名空间里定义

 //串口信息的帧头帧尾
struct Handle
{
    uint8_t twist_[2]={0x55,0x01};
    uint8_t pose_[2]={0x55,0x02};
    uint8_t ender[2]={0xaa, 0x55};//设置检验数据尾
};

//使用一个联合体转化浮点数
union Exchange {
                float target_float;
                uint8_t target_u8[sizeof(float)];
            };


namespace IPPNS{
    
    /*brief:用于对接收以及发送的串口数据作转化*/
    class Command_Trans
    {
        //串口交互数据
        public:
            Handle handle;
            bool ser_open_flag;//串口开启标志位

        private:
       
            geometry_msgs::Vector3 tf_quaternion2RPY(const geometry_msgs::Quaternion& orientation);
            tf::Quaternion tf_quaternion2XYZW(const geometry_msgs::Vector3& Euler);


        public:
            //位置信息以及速度信息的转换
            std::pair<uint8_t*, int> Twist2data(const geometry_msgs::Twist& vel_msg);//将速度信息转换为串口信息
            std::pair<uint8_t*, int> Pose2data(const geometry_msgs::Pose& pose_msg);//将位置信息转换为串口信息


        public:
            
            ~Command_Trans();
        };
        
        Command_Trans::~Command_Trans()
        {
        }

    class COMMON_USB_SERIAL:public Command_Trans
    {   
        
        //串口工作函数
        public:    
            void serialInit();//串口初始化函数
            std::pair<uint8_t*, int> receiveData();
            void writeData(const uint8_t *buf,int Size);//发送函数
            

        //设置串口信息
        public:
            std::string ser_port;//串口号
            std::size_t baudrate;//波特率v
            int time_out;//设置串口超时

        public:
            // using Command_Trans::Command_Trans; //使用基类的构造函数
            COMMON_USB_SERIAL(const std::string port, const std::size_t baudrate);
            ~COMMON_USB_SERIAL();
        };
        
        COMMON_USB_SERIAL::COMMON_USB_SERIAL(const std::string port, const std::size_t baudrate)
        {
            //构造函数，设置串口号和波特率
            this->ser_port=port;
            this->baudrate=baudrate;
            this->time_out=200;//默认串口超时为200ms
        }
        
        COMMON_USB_SERIAL::~COMMON_USB_SERIAL()
        {
        }

}
#endif